Frontend Performance Observer APIλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ λ³ μ±λ₯ λ©νΈλ¦μ μΈ‘μ νκ³ μΆμ νλ λ°©λ²μ μμ보μΈμ. νμ€ λΈλΌμ°μ λ©νΈλ¦μ λμ΄ μ§μ μΌλ‘ λ§μΆ€νλ μ±λ₯ λͺ¨λν°λ§ μ λ΅μ ꡬμΆν μ μμ΅λλ€.
νλ‘ νΈμλ Performance Observer μ¬μ©μ μ§μ λ©νΈλ¦: μ ν리μΌμ΄μ λ³ μΈ‘μ
μΉ κ°λ° μΈκ³μμ μ΅μ μ νλ‘ νΈμλ μ±λ₯μ 보μ₯νλ κ²μ λ§€μ° μ€μν©λλ€. λΈλΌμ°μ λ λ€μν μ±λ₯ λ©νΈλ¦μ μ 곡νμ§λ§, μ’ μ’ μ ν리μΌμ΄μ λ³ λμμ ν¬μ°©νλ λ°λ λΆμ‘±ν©λλ€. λ°λ‘ μ΄ μ§μ μμ Frontend Performance Observer APIμ μ¬μ©μ μ§μ λ©νΈλ¦μ μ μνλ κΈ°λ₯μ΄ λ§€μ° μ μ©ν΄μ§λλ€. μ΄ κΈμμλ Performance Observerλ₯Ό νμ©νμ¬ λ§μΆ€ν λ©νΈλ¦μ μΆμ νκ³ , μ ν리μΌμ΄μ μ μ±λ₯ νκ²½μ λν λ§μΆ€ν λ·°λ₯Ό μ 곡νλ κ³Όμ μ μλ΄ν©λλ€.
μ¬μ©μ μ§μ λ©νΈλ¦μ νμμ± μ΄ν΄νκΈ°
μ΅μ΄ μ½ν μΈ ν νμΈνΈ(FCP), μ΅λ μ½ν μΈ ν νμΈνΈ(LCP), μνΈμμ©κΉμ§μ μκ°(TTI)κ³Ό κ°μ νμ€ λΈλΌμ°μ μ±λ₯ λ©νΈλ¦μ νμ΄μ§ λ‘λ λ° μλ΅μ±μ λν μΌλ°μ μΈ κ°μλ₯Ό μ 곡ν©λλ€. κ·Έλ¬λ μ΄λ¬ν λ©νΈλ¦μ νΉμ μ ν리μΌμ΄μ λ΄μ μ¬μ©μ κ²½νμ μ ννκ² λ°μνμ§ λͺ»νλ κ²½μ°κ° λ§μ΅λλ€. λ€μ μλ리μ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ:
- μ μμκ±°λ μ ν리μΌμ΄μ : μ₯λ°κ΅¬λμ μνμ μΆκ°νκ±°λ κ²°μ νλ‘μΈμ€λ₯Ό μλ£νλ λ° κ±Έλ¦¬λ μκ°.
- μμ λ―Έλμ΄ νλ«νΌ: μ¬μ©μ νΌλλ₯Ό λ‘λνκ±°λ μ λ°μ΄νΈλ₯Ό κ²μνλ λ° κ±Έλ¦¬λ μ§μ° μκ°.
- κΈμ΅ λμ보λ: 볡μ‘ν κΈμ΅ λ°μ΄ν°λ₯Ό κ³μ°νκ³ νμνλ λ° νμν μκ°.
- μ§λ μ ν리μΌμ΄μ : μ§λ νμΌμ λ‘λνκ±°λ μ§λ¦¬μ λ°μ΄ν°λ₯Ό λ λλ§νλ λ° κ±Έλ¦¬λ μ§μ° μκ°.
μ΄λ¬ν μ ν리μΌμ΄μ λ³ μμ μ μ¬μ©μ κ²½νμ λ§€μ° μ€μνμ§λ§ νμ€ μ±λ₯ λ©νΈλ¦μΌλ‘λ μ§μ ν¬μ°©λμ§ μμ΅λλ€. μ¬μ©μ μ§μ λ©νΈλ¦μ μ΄ κ²©μ°¨λ₯Ό ν΄μνμ¬ μ€μν κΈ°λ₯μ μ±λ₯μ λͺ¨λν°λ§νκ³ μ¬μ©μ νλμ λν λ κΉμ μ΄ν΄λ₯Ό μ»μ μ μκ² ν΄μ€λλ€.
Performance Observer API μκ°
Performance Observer APIλ λΈλΌμ°μ μμ λ°μνλ μ±λ₯ λ©νΈλ¦μ κ΄μ°°νκ³ μμ§νλ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ `paint`, `resource`, `navigation` λ° κ°μ₯ μ€μν `measure`μ `mark`μ κ°μ νΉμ μ±λ₯ νλͺ© μ νμ ꡬλ ν μ μμ΅λλ€. μ΄λ¬ν μ΄λ²€νΈ κΈ°λ° μ κ·Ό λ°©μμ ν΅ν΄ μ±λ₯ μ΄λ²€νΈμ μ€μκ°μΌλ‘ λ°μνκ³ λΆμμ μν λ°μ΄ν°λ₯Ό μμ§ν μ μμ΅λλ€.
Performance Observer APIμ ν΅μ¬ κ΅¬μ± μμλ λ€μκ³Ό κ°μ΅λλ€:
- `PerformanceObserver` μμ±μ: μλ‘μ΄ PerformanceObserver μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.
- `observe()` λ©μλ: κ΄μ°°ν μ±λ₯ νλͺ© μ νμ μ§μ ν©λλ€.
- `disconnect()` λ©μλ: μ΅μ λ²κ° μ±λ₯ νλͺ©μ μμ νλ κ²μ μ€μ§ν©λλ€.
- `takeRecords()` λ©μλ: λ§μ§λ§ νΈμΆ μ΄ν λ²νΌμ μ μ₯λ λͺ¨λ μ±λ₯ νλͺ©μ λ°νν©λλ€.
`mark`μ `measure`λ₯Ό μ¬μ©ν μ¬μ©μ μ§μ λ©νΈλ¦ μ μ
`mark`μ `measure` APIλ μ¬μ©μ μ§μ μ±λ₯ λ©νΈλ¦μ μμ±νλ λ° κΈ°λ³Έμ΄ λ©λλ€. μλ λ°©μμ λ€μκ³Ό κ°μ΅λλ€:
- `performance.mark(markName)`: λΈλΌμ°μ μ μ±λ₯ νμλΌμΈμ νμμ€ν¬νκ° μ°ν λ§μ»€λ₯Ό μμ±ν©λλ€. μΈ‘μ νλ €λ νΉμ μ΄λ²€νΈμ μμκ³Ό λμ λνλ΄λ λ° `mark`λ₯Ό μ¬μ©ν©λλ€.
- `performance.measure(measureName, startMark, endMark)`: λ λ§ν¬ μ¬μ΄μ μ§μ μκ°μ κ³μ°νκ³ `measure` μ νμ μ±λ₯ νλͺ©μ μμ±ν©λλ€. `measureName`μ μ¬μ©μ μ§μ λ©νΈλ¦μ κ³ μ μλ³μμ λλ€.
μλ₯Ό λ€μ΄ μ€λͺ ν΄ λ³΄κ² μ΅λλ€. μ¬μ©μ μνΈμμ© ν νΉμ μ»΄ν¬λνΈκ° λ λλ§λλ λ° κ±Έλ¦¬λ μκ°μ μΈ‘μ νκ³ μΆλ€κ³ κ°μ ν΄ λ΄ μλ€.
// Start measuring the rendering process
performance.mark('componentRenderStart');
// ... (Component rendering logic here) ...
// End measuring the rendering process
performance.mark('componentRenderEnd');
// Create a measure to calculate the duration
performance.measure('componentRenderTime', 'componentRenderStart', 'componentRenderEnd');
μ¬μ©μ μ§μ λ©νΈλ¦μ μν Performance Observer ꡬννκΈ°
μ΄μ `measure` νλͺ©μ μμ νκ³ μ¬μ©μ μ§μ λ©νΈλ¦ λ°μ΄ν°λ₯Ό μ²λ¦¬νκΈ° μν Performance Observerλ₯Ό μμ±ν΄ λ³΄κ² μ΅λλ€.
const observer = new PerformanceObserver((list) => {
list.getEntriesByType('measure').forEach((entry) => {
console.log(`Custom Metric: ${entry.name} - Duration: ${entry.duration}ms`);
// In a real-world scenario, you would send this data to your analytics platform
// Example:
// trackCustomMetric(entry.name, entry.duration);
});
});
observer.observe({ entryTypes: ['measure'] });
μ΄ μ½λ μ€λν«μ `measure` νλͺ©μ μμ νλ Performance Observerλ₯Ό μμ±ν©λλ€. `measure` νλͺ©μ΄ μμ±λλ©΄(`performance.measure`λ₯Ό ν΅ν΄) μ΅μ λ²μ μ½λ°± ν¨μκ° μ€νλ©λλ€. μ½λ°± ν¨μλ μμ§λ νλͺ©μ λ°λ³΅νλ©° λ©νΈλ¦ μ΄λ¦κ³Ό μ§μ μκ°μ μ½μμ κΈ°λ‘νκ³ , μ΄μμ μΌλ‘λ μΆκ° λΆμμ μν΄ λ°μ΄ν°λ₯Ό λΆμ νλ«νΌμΌλ‘ μ μ‘ν©λλ€.
μ€μ© μμ : μ€μ μ¬μ©μ μ§μ λ©νΈλ¦ νμ©
μ¬μ©μ μ§μ λ©νΈλ¦μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μ±λ₯μ νΉμ μΈ‘λ©΄μ λͺ¨λν°λ§νλ λͺ κ°μ§ μ€μ©μ μΈ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1. API μλ΅ μκ° μΈ‘μ
λ°±μλ APIλ‘λΆν° μλ΅μ λ°λ λ° κ±Έλ¦¬λ μκ°μ μΆμ νλ κ²μ μ μ¬μ μΈ λ³λͺ© νμμ μλ³νλ λ° λ§€μ° μ€μν©λλ€. API μλ΅ μκ°μ μΈ‘μ νλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€:
async function fetchData() {
performance.mark('apiCallStart');
const response = await fetch('/api/data');
performance.mark('apiCallEnd');
performance.measure('apiResponseTime', 'apiCallStart', 'apiCallEnd');
return response.json();
}
μ΄ μ½λ μ€λν«μ `/api/data` μλν¬μΈνΈμμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ λ° κ±Έλ¦¬λ μκ°μ μΈ‘μ ν©λλ€. `apiResponseTime` λ©νΈλ¦μ μμ² μμλΆν° μλ΅ μμ κΉμ§μ API νΈμΆ μ 체 κΈ°κ°μ ν¬μ°©ν©λλ€.
2. μ΄λ―Έμ§ λ‘λ μκ° μΆμ
μ΄λ―Έμ§λ μ’ μ’ νμ΄μ§ λ‘λ μ±λ₯μ μ€μν μμμ λλ€. μ΄λ―Έμ§κ° λ‘λλλ λ° κ±Έλ¦¬λ μκ°μ μΈ‘μ νλ©΄ ν¬κΈ°κ° λ무 ν° μ΄λ―Έμ§λ λλ¦° CDNμ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€.
const image = new Image();
image.onload = () => {
performance.mark('imageLoadEnd');
performance.measure('imageLoadTime', 'imageLoadStart', 'imageLoadEnd');
};
performance.mark('imageLoadStart');
image.src = 'https://example.com/image.jpg';
μ΄ μ½λ μ€λν«μ μ§μ λ URLμμ μ΄λ―Έμ§λ₯Ό λ‘λνλ λ° κ±Έλ¦¬λ μκ°μ μΈ‘μ ν©λλ€. `imageLoadTime` λ©νΈλ¦μ μ΄λ―Έμ§ μμ² μμλΆν° μ΄λ―Έμ§ λ‘λ μλ£κΉμ§μ κΈ°κ°μ ν¬μ°©ν©λλ€.
3. μλνν° μ€ν¬λ¦½νΈ μ€ν μκ° λͺ¨λν°λ§
μλνν° μ€ν¬λ¦½νΈλ μ’ μ’ νλ‘ νΈμλ μ±λ₯μ μλΉν μν₯μ λ―ΈμΉ μ μμ΅λλ€. μ€ν μκ°μ μΈ‘μ νλ©΄ λ¬Έμ κ° μλ μ€ν¬λ¦½νΈλ₯Ό μλ³νκ³ λ‘λ© λλ μ€νμ μ΅μ ννλ λ° λμμ΄ λ μ μμ΅λλ€.
// Assuming the third-party script has a global function called 'thirdPartyScript'
performance.mark('thirdPartyScriptStart');
thirdPartyScript();
performance.mark('thirdPartyScriptEnd');
performance.measure('thirdPartyScriptExecutionTime', 'thirdPartyScriptStart', 'thirdPartyScriptEnd');
μ΄ μ½λ μ€λν«μ κ°μμ μλνν° μ€ν¬λ¦½νΈ μ€ν μκ°μ μΈ‘μ ν©λλ€. `thirdPartyScriptExecutionTime` λ©νΈλ¦μ μ€ν¬λ¦½νΈ μ€ν κΈ°κ°μ ν¬μ°©ν©λλ€.
4. νΉμ μ»΄ν¬λνΈμ μνΈμμ©κΉμ§μ μκ°(TTI) μΈ‘μ
TTIλ νμ€ λ©νΈλ¦μ΄μ§λ§, νΉμ μ»΄ν¬λνΈκ° μνΈμμ© κ°λ₯ν΄μ§λ λ° κ±Έλ¦¬λ μκ°μ μΈ‘μ νλλ‘ μ¬μ©μ μ§μ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ΄λ€ μ»΄ν¬λνΈκ° μ 체 TTIμ κ°μ₯ λ§μ΄ κΈ°μ¬νλμ§ μ νν μ°ΎμλΌ μ μμ΅λλ€.
// After your component is fully rendered and interactive
performance.mark('componentInteractive');
performance.measure('componentTTI', 'componentRenderStart', 'componentInteractive');
μ΄ μμ λ `componentRenderStart`κ° μ΄μ μ μ μλμλ€κ³ κ°μ ν©λλ€. μ»΄ν¬λνΈ λ λλ§μ΄ μμλ μμ λΆν° μμ ν μνΈμμ© κ°λ₯ν΄μ§ μμ κΉμ§μ μκ°μ μΈ‘μ ν©λλ€.
κ³ κΈ κΈ°μ λ° κ³ λ € μ¬ν
κΈ°λ³Έ μ¬ν μΈμ, Performance Observerμ μ¬μ©μ μ§μ λ©νΈλ¦μ ν¨κ³Όμ μΌλ‘ μ¬μ©νκΈ° μν λͺ κ°μ§ κ³ κΈ κΈ°μ λ° κ³ λ € μ¬νμ λ€μκ³Ό κ°μ΅λλ€:
1. 볡μ‘ν μλ리μ€λ₯Ό μν User Timing API μ¬μ©
λ 볡μ‘ν μλ리μ€μ κ²½μ°, μ΄λ²€νΈμ μ¬λ¬ λ¨κ³λ₯Ό μΆμ νκΈ° μν΄ μ¬λ¬ κ°μ λ§ν¬μ μΈ‘μ νλͺ©μ λ§λ€μ΄μΌ ν μ μμ΅λλ€. User Timing APIλ μ΄λ¬ν λ§μ»€μ κ³μ°μ κ΄λ¦¬νλ μ μ°ν λ°©λ²μ μ 곡ν©λλ€.
2. Long Tasks API νμ©
Long Tasks APIλ λ©μΈ μ€λ λλ₯Ό μ₯μκ° μ°¨λ¨νμ¬ μ¬μ©μ κ²½νμ μ ν΄νλ μμ μ μλ³νλ λ° λμμ΄ λ μ μμ΅λλ€. μ΄λ₯Ό μ¬μ©μ μ§μ λ©νΈλ¦κ³Ό κ²°ν©νμ¬ κΈ΄ μμ κ³Ό νΉμ μ ν리μΌμ΄μ μμ μ μ°κ΄μν¬ μ μμ΅λλ€.
3. `buffered` νλκ·Έ λ° μ§μ° λ‘λ© μ΅μ λ²
μΌλΆ μ±λ₯ μ΄λ²€νΈκ° μ΄λ―Έ λ°μν νμ Performance Observerλ₯Ό μ΄κΈ°ννλ κ²½μ°, `buffered` νλκ·Έλ₯Ό μ¬μ©νμ¬ ν΄λΉ μ΄λ²€νΈλ₯Ό κ²μν μ μμ΅λλ€. μ:
const observer = new PerformanceObserver((list) => { /* ... */ });
observer.observe({ entryTypes: ['measure'], buffered: true });
4. μ€λ‘νλ§ λ° λλ°μ΄μ±
λΉλκ° λμ μλ리μ€μμλ μ±λ₯ μ€λ²ν€λλ₯Ό νΌνκΈ° μν΄ λ©νΈλ¦ μμ§μ μ€λ‘νλ§νκ±°λ λλ°μ΄μ±νλ κ²μ κ³ λ €νμμμ€. μλ₯Ό λ€μ΄, λ§μ°μ€ μμ§μμ μΆμ νλ κ²½μ° 100msλ§λ€ λ°μ΄ν°λ₯Ό μμ§ν μ μμ΅λλ€.
5. λ°μ΄ν° μ§κ³ λ° λΆμ
Performance Observerκ° μμ§ν μμ μ±λ₯ λ°μ΄ν°λ μλ―Έ μλ ν΅μ°°λ ₯μ μ 곡νκΈ° μν΄ μ§κ³ λ° λΆμλμ΄μΌ ν©λλ€. μ΄λ μΌλ°μ μΌλ‘ Google Analytics, New Relic λλ μ체 κ΅¬μΆ μ루μ κ³Ό κ°μ λΆμ νλ«νΌμΌλ‘ λ°μ΄ν°λ₯Ό μ μ‘νλ κ²μ ν¬ν¨ν©λλ€. λΆμ νλ«νΌμ΄ μ¬μ©μ μ§μ λ©νΈλ¦μ μ²λ¦¬νκ³ νμν λ³΄κ³ κΈ°λ₯μ μ 곡ν μ μλμ§ νμΈνμμμ€.
6. μ€μ μ¬μ©μ λͺ¨λν°λ§ (RUM)
μ ν리μΌμ΄μ μ±λ₯μ μ€μ λͺ¨μ΅μ νμ νλ €λ©΄ μ€μ μ¬μ©μ λͺ¨λν°λ§(RUM)μ ꡬννμμμ€. RUMμ μ€μ μ¬μ©μμ μ€μ νκ²½μμ μ±λ₯ λ°μ΄ν°λ₯Ό μμ§νμ¬ λ€μν μ¬μ©μμ μ₯μΉμμ μ ν리μΌμ΄μ μ΄ μ΄λ»κ² μνλλμ§μ λν κ·μ€ν ν΅μ°°λ ₯μ μ 곡ν©λλ€. μ¬μ©μ μ§μ λ©νΈλ¦μ ν¬κ΄μ μΈ RUM μ λ΅μ νμμ μΈ λΆλΆμ λλ€.
7. 보μ κ³ λ € μ¬ν
μ±λ₯ λ°μ΄ν°λ₯Ό μμ§νκ³ μ μ‘ν λ 보μμ μ μνμμμ€. λ―Όκ°ν μ¬μ©μ μ 보λ₯Ό μμ§νμ§ λ§κ³ λ°μ΄ν°κ° μμ νκ² μ μ‘λλλ‘(μ: HTTPS μ¬μ©) νμμμ€.
μμ : Resource Timing APIλ₯Ό μ¬μ©ν 첫 λ°μ΄νΈκΉμ§μ μκ°(TTFB) μΈ‘μ
TTFBλ λΈλΌμ°μ κ° μλ²λ‘λΆν° λ°μ΄ν°μ 첫 λ°μ΄νΈλ₯Ό μμ νλ λ° κ±Έλ¦¬λ μκ°μ λλ€. `mark`μ `measure`λ‘ μ μλ μ격ν μλ―Έμ μ¬μ©μ μ§μ λ©νΈλ¦μ μλμ§λ§, κ°μΉ μλ μ±λ₯ μ§νμ΄λ©° Resource Timing APIλ₯Ό ν΅ν΄ μ κ·Όνκ³ Performance Observerλ‘ κ΄μ°°ν μ μμ΅λλ€.
const ttfbObserver = new PerformanceObserver((list) => {
list.getEntriesByType('resource').forEach((entry) => {
if (entry.name === window.location.href) { // Check if it's the main document
const ttfb = entry.responseStart - entry.startTime;
console.log(`TTFB: ${ttfb}ms`);
// Send ttfb to your analytics platform
}
});
});
ttfbObserver.observe({ type: 'resource', buffered: true });
ν¬λ‘μ€ λΈλΌμ°μ νΈνμ±
Performance Observer APIλ μ΅μ λΈλΌμ°μ μμ λ리 μ§μλ©λλ€. κ·Έλ¬λ νμ λΈλΌμ°μ νΈνμ±μ νμΈνκ³ κ΅¬ν λΈλΌμ°μ λ₯Ό μν λ체 λ©μ»€λμ¦μ μ 곡νλ κ²μ΄ μ’μ΅λλ€. Performance Observer APIλ₯Ό μ§μνμ§ μλ λΈλΌμ°μ λ₯Ό μν΄ ν΄λ¦¬νμ΄λ λ κ°λ¨ν μΈ‘μ κΈ°μ μ μ¬μ©ν μ μμ΅λλ€.
if ('PerformanceObserver' in window) {
// Use Performance Observer API
const observer = new PerformanceObserver((list) => { /* ... */ });
observer.observe({ entryTypes: ['measure'] });
} else {
// Use a fallback mechanism (e.g., Date.now() for simple time measurements)
console.warn('PerformanceObserver API not supported in this browser.');
}
μ¬μ©μ μ§μ λ©νΈλ¦ μ¬μ©μ μν λͺ¨λ² μ¬λ‘
- λͺ νν λͺ©ν μ μ: μ΄λ€ νΉμ μ±λ₯ μΈ‘λ©΄μ λͺ¨λν°λ§νκ³ μΆμΌμ κ°μ?
- μλ―Έ μλ λ©νΈλ¦ μ΄λ¦ μ ν: μ¬μ©μ μ§μ λ©νΈλ¦μ λν΄ μ€λͺ μ μ΄κ³ μΌκ΄λ μ΄λ¦μ μ¬μ©νμΈμ.
- λ©νΈλ¦ λ¬Έμν: κ° μ¬μ©μ μ§μ λ©νΈλ¦μ λͺ©μ κ³Ό κ³μ° λ°©μμ λͺ ννκ² λ¬ΈμννμΈμ.
- μ±λ₯ μμ° μ€μ : μ¬μ©μ μ§μ λ©νΈλ¦μ λν νμ© κ°λ₯ν μ±λ₯ μκ³κ°μ μ μνμΈμ.
- λ°μ΄ν° μμ§ λ° λΆμ μλν: λΉλ νλ‘μΈμ€ λ° λΆμ νμ΄νλΌμΈμ μ¬μ©μ μ§μ λ©νΈλ¦ μμ§μ ν΅ν©νμΈμ.
- μ κΈ°μ μΌλ‘ λ©νΈλ¦ κ²ν λ° κ°μ : μ ν리μΌμ΄μ μ΄ λ°μ ν¨μ λ°λΌ μ±λ₯ λͺ¨λν°λ§ μꡬ μ¬νλ λ³κ²½λ μ μμ΅λλ€.
κ²°λ‘
νλ‘ νΈμλ μ±λ₯μ λͺ©μ μ§κ° μλ μ§μμ μΈ μ¬μ μ λλ€. Frontend Performance Observer APIλ₯Ό νμ©νκ³ μ¬μ©μ μ§μ λ©νΈλ¦μ μ μν¨μΌλ‘μ¨ μ ν리μΌμ΄μ μ±λ₯μ λν λ κΉμ μ΄ν΄λ₯Ό μ»κ³ κ°μ μμμ μλ³ν μ μμ΅λλ€. μ΄λ¬ν λ§μΆ€ν μ±λ₯ λͺ¨λν°λ§ μ κ·Ό λ°©μμ μ¬μ©μ κ²½νμ μ΅μ ννκ³ λ λΉ λ₯΄κ³ λ°μμ±μ΄ λ°μ΄λ μΉ μ ν리μΌμ΄μ μ μ 곡ν μ μλλ‘ νμ μ€μ΄μ€λλ€. μμΉλ μ₯μΉμ κ΄κ³μμ΄ λͺ¨λ μ¬μ©μμκ² μ ν리μΌμ΄μ μ΄ μ΅μ μΌλ‘ μλνλλ‘ νλ €λ©΄ μ§μμ μΌλ‘ λ©νΈλ¦μ λͺ¨λν°λ§, λΆμ λ° κ°μ νλ κ²μ μμ§ λ§μμμ€.
μ΄ κΈμμλ Performance Observer APIλ₯Ό μ¬μ©ν μ¬μ©μ μ§μ λ©νΈλ¦μ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡νμ΅λλ€. μ΄λ¬ν κΈ°μ μ νΉμ μ ν리μΌμ΄μ μꡬμ λ§κ² μ‘°μ νκ³ , μ±λ₯ μ΅μ νμ λν μ 보μ μ κ°ν κ²°μ μ λ΄λ¦¬κΈ° μν΄ λ°μ΄ν°λ₯Ό μ§μμ μΌλ‘ λͺ¨λν°λ§νκ³ λΆμνλ κ²μ΄ μ€μν©λλ€.
μ°Έκ³ μλ£: